home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 February / PCWorld_2006-02_cd.bin / software / vyzkuste / triky / triky.exe / httrack-3.33.exe / {app} / src / htscatchurl.c < prev    next >
C/C++ Source or Header  |  2004-05-09  |  8KB  |  280 lines

  1. /* ------------------------------------------------------------ */
  2. /*
  3. HTTrack Website Copier, Offline Browser for Windows and Unix
  4. Copyright (C) Xavier Roche and other contributors
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20.  
  21. Important notes:
  22.  
  23. - We hereby ask people using this source NOT to use it in purpose of grabbing
  24. emails addresses, or collecting any other private information on persons.
  25. This would disgrace our work, and spoil the many hours we spent on it.
  26.  
  27.  
  28. Please visit our Website: http://www.httrack.com
  29. */
  30.  
  31.  
  32. /* ------------------------------------------------------------ */
  33. /* File: URL catch .h                                           */
  34. /* Author: Xavier Roche                                         */
  35. /* ------------------------------------------------------------ */
  36.  
  37. /* Internal engine bytecode */
  38. #define HTS_INTERNAL_BYTECODE
  39.  
  40. // Fichier intercepteur d'URL .c
  41.  
  42. /* specific definitions */
  43. /* specific definitions */
  44. #include "htsbase.h"
  45. #include "htsnet.h"
  46. #include "htslib.h"
  47. #ifndef  _WIN32_WCE
  48. #include <fcntl.h>
  49. #endif
  50. #if HTS_WIN
  51. #else
  52. #include <arpa/inet.h>
  53. #endif
  54. /* END specific definitions */
  55.  
  56. /* dΘfinitions globales */
  57. #include "htsglobal.h"
  58.  
  59. /* htslib */
  60. /*#include "htslib.h"*/
  61.  
  62. /* catch url */
  63. #include "htscatchurl.h"
  64.  
  65.  
  66. // URL Link catcher
  67.  
  68. // 0- Init the URL catcher with standard port
  69.  
  70. // catch_url_init(&port,&return_host);
  71. HTSEXT_API T_SOC catch_url_init_std(int* port_prox,char* adr_prox) {
  72.   T_SOC soc;
  73.   int try_to_listen_to[]={8080,3128,80,81,82,8081,3129,31337,0,-1};
  74.   int i=0;
  75.   do {
  76.     soc=catch_url_init(&try_to_listen_to[i],adr_prox);
  77.     *port_prox=try_to_listen_to[i];
  78.     i++;
  79.   } while( (soc == INVALID_SOCKET) && (try_to_listen_to[i]>=0));
  80.   return soc;
  81. }
  82.  
  83.  
  84. // 1- Init the URL catcher
  85.  
  86. // catch_url_init(&port,&return_host);
  87. HTSEXT_API T_SOC catch_url_init(int* port,char* adr) {
  88.   T_SOC soc = INVALID_SOCKET;
  89.   char h_loc[256+2];
  90.  
  91.   if (gethostname(h_loc,256)==0) {    // host name
  92.     SOCaddr server;
  93.     int server_size=sizeof(server);
  94.     t_hostent* hp_loc;
  95.     t_fullhostent buffer;
  96.  
  97.     // effacer structure
  98.     memset(&server, 0, sizeof(server));
  99.     
  100.     if ( (hp_loc=vxgethostbyname(h_loc, &buffer)) ) {  // notre host      
  101.  
  102.       // copie adresse
  103.       SOCaddr_copyaddr(server, server_size, hp_loc->h_addr_list[0], hp_loc->h_length);
  104.  
  105.       if ( (soc=socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0)) != INVALID_SOCKET) {
  106.         SOCaddr_initport(server, *port);
  107.         if ( bind(soc,(struct sockaddr*) &server,server_size) == 0 ) {
  108.           SOCaddr server2;
  109.           int len;
  110.           len=sizeof(server2);
  111.           // effacer structure
  112.           memset(&server2, 0, sizeof(server2));
  113.           if (getsockname(soc,(struct sockaddr*) &server2,&len) == 0) {
  114.             *port=ntohs(SOCaddr_sinport(server));  // rΘcupΘrer port
  115.             if (listen(soc,10)>=0) {    // au pif le 10
  116.               SOCaddr_inetntoa(adr, 128, server2, len);
  117.             } else {
  118. #ifdef _WIN32
  119.               closesocket(soc);
  120. #else
  121.               close(soc);
  122. #endif
  123.               soc=INVALID_SOCKET;
  124.             }
  125.             
  126.             
  127.           } else {
  128. #ifdef _WIN32
  129.             closesocket(soc);
  130. #else
  131.             close(soc);
  132. #endif
  133.             soc=INVALID_SOCKET;
  134.           }
  135.           
  136.           
  137.         } else {
  138. #ifdef _WIN32
  139.           closesocket(soc);
  140. #else
  141.           close(soc);
  142. #endif
  143.           soc=INVALID_SOCKET;
  144.         }
  145.       }
  146.     }
  147.   }
  148.   return soc;
  149. }
  150.  
  151. // 2 - Wait for URL
  152.  
  153. // catch_url
  154. // returns 0 if error
  155. // url: buffer where URL must be stored - or ip:port in case of failure
  156. // data: 32Kb
  157. HTSEXT_API int catch_url(T_SOC soc,char* url,char* method,char* data) {
  158.   int retour=0;
  159.  
  160.   // connexion (accept)
  161.   if (soc != INVALID_SOCKET) {
  162.     T_SOC soc2;
  163.     struct sockaddr dummyaddr;
  164.     int dummylen = sizeof(struct sockaddr);  
  165.     while ( (soc2=accept(soc,&dummyaddr,&dummylen)) == INVALID_SOCKET);
  166.   /*
  167. #ifdef _WIN32
  168.     closesocket(soc);
  169. #else
  170.     close(soc);
  171. #endif
  172.   */
  173.     soc = soc2;
  174.     /* INFOS */
  175.     {
  176.       SOCaddr server2;
  177.       int len;
  178.       len=sizeof(server2);
  179.       // effacer structure
  180.       memset(&server2, 0, sizeof(server2));
  181.       if (getpeername(soc,(struct sockaddr*) &server2,&len) == 0) {
  182.         char dot[256+2];
  183.         SOCaddr_inetntoa(dot, 256, server2, sizeof(server2));
  184.         sprintf(url,"%s:%d", dot, htons(SOCaddr_sinport(server2)));  
  185.       }
  186.     }
  187.     /* INFOS */
  188.  
  189.     // rΘception
  190.     if (soc != INVALID_SOCKET) {
  191.       char line[1000];
  192.       char protocol[256];
  193.       line[0]=protocol[0]='\0';
  194.       //
  195.       socinput(soc,line,1000);
  196.       if (strnotempty(line)) {
  197.         if (sscanf(line,"%s %s %s",method,url,protocol) == 3) {
  198.           char BIGSTK url_adr[HTS_URLMAXSIZE*2];
  199.           char BIGSTK url_fil[HTS_URLMAXSIZE*2];
  200.           // mΘthode en majuscule
  201.           int i,r=0;
  202.           url_adr[0]=url_fil[0]='\0';
  203.           //
  204.           for(i=0;i<(int) strlen(method);i++) {
  205.             if ((method[i]>='a') && (method[i]<='z'))
  206.               method[i]-=('a'-'A');
  207.           }
  208.           // adresse du lien
  209.           if (ident_url_absolute(url,url_adr,url_fil)>=0) {
  210.             // Traitement des en-tΩtes
  211.             char BIGSTK loc[HTS_URLMAXSIZE*2];
  212.             htsblk blkretour;
  213.             memset(&blkretour, 0, sizeof(htsblk));    // effacer
  214.             blkretour.location=loc;    // si non nul, contiendra l'adresse vΘritable en cas de moved xx
  215.             // Lire en tΩtes restants
  216.             sprintf(data,"%s %s %s\r\n",method,url_fil,protocol);
  217.             while(strnotempty(line)) {
  218.               socinput(soc,line,1000);
  219.               treathead(NULL,NULL,NULL,&blkretour,line);  // traiter
  220.               strcatbuff(data,line);
  221.               strcatbuff(data,"\r\n");
  222.             }
  223.             // CR/LF final de l'en tΩte inutile car dΘja placΘ via la ligne vide juste au dessus
  224.             //strcatbuff(data,"\r\n");
  225.             if (blkretour.totalsize>0) {
  226.               int len=(int)min(blkretour.totalsize,32000);
  227.               int pos=strlen(data);
  228.               // Copier le reste (post Θventuel)
  229.               while((len>0) && ((r=recv(soc,(char*) data+pos,len,0))>0) ) {
  230.                 pos+=r;
  231.                 len-=r;
  232.                 data[pos]='\0';       // terminer par NULL
  233.               }
  234.             }
  235.             // Envoyer page
  236.             sprintf(line,CATCH_RESPONSE);
  237.             send(soc,line,strlen(line),0);
  238.             // OK!
  239.             retour=1;
  240.           }
  241.         }
  242.       }  // sinon erreur
  243.     }
  244.   }
  245.   if (soc != INVALID_SOCKET) {
  246. #ifdef _WIN32
  247.     closesocket(soc);
  248.     /*
  249.     WSACleanup();
  250.     */
  251. #else
  252.     close(soc);
  253. #endif
  254.   }
  255.   return retour;
  256. }
  257.  
  258.  
  259.  
  260. // Lecture de ligne sur socket
  261. void socinput(T_SOC soc,char* s,int max) {
  262.   int c;
  263.   int j=0;
  264.   do {
  265.     unsigned char b;
  266.     if (recv(soc,(char*) &b,1,0)==1) {
  267.       c=b;
  268.       switch(c) {
  269.         case 13: break;  // sauter CR
  270.         case 10: c=-1; break;
  271.         case 9: case 12: break;  // sauter ces caractΦres
  272.         default: s[j++]=(char) c; break;
  273.       }
  274.     } else
  275.       c=EOF;
  276.   }  while((c!=-1) && (c!=EOF) && (j<(max-1)));
  277.   s[j++]='\0';
  278. }
  279.  
  280.